//
// ----------------------------------------------------------------------------
// 文件： TcpServerClient.h
// 日期： 2018年05月24日
// 功能： Tcp协议通讯模块
// 版本： v1.0
// 作者： 谈新
// 邮件： tanxin@smg.cn
// ----------------------------------------------------------------------------
//
#ifndef TCPSERVERCLIENT_H_INCLUDE
#define TCPSERVERCLIENT_H_INCLUDE

#ifdef __cplusplus
extern "C" {
#endif

#include <stdlib.h>

#if defined(LINUX)
    #include <netinet/in.h>
    #include <net/if.h>
    #include <unistd.h>
#else
    #include <ws2tcpip.h>
#endif

#ifndef NETWORK_CALLBACK_DEFINITION
#define NETWORK_CALLBACK_DEFINITION
typedef void (*LOGCALLBACK)(int level, char *message);
typedef void (*TCPCALLBACK)(char *name, int fd, char *ip, unsigned short port);
typedef void (*UDPCALLBACK)(char *name, int fd, struct sockaddr *to, socklen_t tolen);
#endif 

#ifndef TCP_SEVERCLIENT_HANDLE_DEFINITION
#define TCP_SEVERCLIENT_HANDLE_DEFINITION
typedef struct _TCPHANDLE
{
    char           name[256];
    char           host[20];
    unsigned short port;
    int            fd;
    char           cip[20];
	unsigned short cport;
	int            connected;
	TCPCALLBACK    tcpcallback;
	LOGCALLBACK    logcallback;
}   TCPHANDLE;

typedef struct _HTCP
{
    char           name[256];
    char           host[16];
    unsigned short port;
    int            fd;
	int            loop;
	int            connected;
    #if defined(LINUX)
	pthread_t      thread;
    #else
	HANDLE         thread;
    #endif
	TCPCALLBACK    tcpcallback;
	LOGCALLBACK    logcallback;
}   HTCP;
#endif

void    *TcpServerListenThread(void *param);
void    *TcpServerConnectThread(void *param);
void    *TcpClientConnectThread(void *param);
//void    *TcpClientHeartbeatThread(void *param);

int     GetTcpServerStatus();
void    StopTcpServer();
int     StartTcpServer(const char *name, unsigned short port, TCPCALLBACK tcpcallback);
void    TcpSocketInterface(char *name, int fd, char *ip, unsigned short port);

int     GetTcpClientStatus();
void    StopTcpClient();
int     CreateTcpClient(const char *name,const char *host, unsigned short port, TCPCALLBACK tcpcallback, LOGCALLBACK logcallback);

void    CloseTCPS(HTCP *tcp);
HTCP    *OpenTCPS(const char *name, unsigned short port, TCPCALLBACK tcpcallback, LOGCALLBACK logcallback);

void    CloseTCPC(HTCP *tcp);
HTCP    *OpenTCPC(const char *name,const char *host, unsigned short port, TCPCALLBACK tcpcallback, LOGCALLBACK logcallback);


		//返回  1 : 正常
		//返回  0 : 对方关闭连接
		//返回 -1 : socket读取错误 
		//返回 -2 : 本方关闭连接 
int     readchar(int fd,char *ptr,int *loop);

		//返回 >0 : 正常
		//返回  0 : 对方关闭连接
		//返回 -1 : socket读取错误 
		//返回 -2 : 本方关闭连接 
		//返回 -3 : 读取的字符串超长 
int     readline(int fd,void *buf,int *len,int maxlen,int *loop);

		//返回 >0 : 正常
		//返回  0 : 对方关闭连接
		//返回 -1 : socket读取错误 
		//返回 -2 : 本方关闭连接 
		//返回 -3 : 读取的字符串超长 
int     readlineline(int fd,void *buf,int *len,int maxlen,int *loop);

		//返回 >0 : 正常
		//返回  0 : 对方关闭连接
		//返回 -1 : socket读取错误 
		//返回 -2 : 本方关闭连接 
		//返回 -3 : 读取的字符串超长 
int     TcpSocketRead(int fd,char *str,int *len,int maxlen,int *loop);

		//返回 >0 : 发送成功
		//返回 -1 : len错误
		//返回 -2 : 申请内存失败
		//返回 -3 : 发送失败
int     TcpSocketWrite(int fd,const char *str,int len);

#ifdef __cplusplus
}
#endif

#endif 


